<blockquote>
    <p>控制层 [@Controller]</p>
    <footer>拥有和Spring基本一样的功能, 却减少了很多配置, 将Srping里面的<code>@Controller</code> <code>@RequestMapping</code>合二唯一, 例如<code>@Controller("user")</code>
    </footer>
</blockquote>
<div class="panel panel-default">
    <div class="panel-body">
        <p><b style="color:red">注意</b>：和Spring对比方法注解上面减少了@ResponseBody 或者 类上面@RestController, 返回类型由方法返回值决定, 我在写一遍如下：</p>
        <p>String 类型：会根据常量里面的配置放回响应的视图类型, 默认是jsp</p>
        <p>Object 类型：当返回Object时候会去掉值为null的属性</p>
        <p>&lt;T&gt 类型：会保留所有属性输出</p>
        <p>Resource 类型：当new Resource("a.txt", data) 时, 可以将resouce下面的文件当做模板进行读取然后响应输出, 例如：druid管理页面, 加强后就是一套模板引擎</p>
        <p>Json 类型：会包装一层响应吗输出</p>
        <div style="margin-left:50px;">
            <p>成功：当Json.success("hello world java!") 时, <code>{"message":"ok","data":"hello world
                java!","code":0}</code></p>
            <p>失败：当Json.fail("code is error!") 时, 或用使用全局枚举 Json.fail(ResponseCode.ARGUMENTS_ERROR), <code>{"message":"code
                is error!","code":107}</code></p>
            <p>数据值为空：当Json.succcess(null) 时, 会报错<code>{"message":"response data is null","code":109}</code></p>
            <p>异常：当Json.exception(ResponseCode.ARGUMENTS_ERROR) 时, 会进行日志记录, 并报错<code>{"message":"request argument is
                error","code":1011}</code></p>
        </div>
    </div>
</div>
<h5><b>String 类型</b> 返回视图, 以下会访问test.jsp 当配置了视图模板[freemarker或beetl]时会返回模板视图</h5>
<div class="clear">
    <p>常量配置 me.setViewType(ViewType.JSP); 默认是JSP视图</p>
    <p>ViewType.FREEMARKER 返回freemarker视图</p>
    <p>ViewType.BEETL 返回beetl视图</p>
    <p>ViewType.VELOCITY 返回velocity视图</p>
</div>
<pre class="code brush:java">
    /**
     * 测试控制器类
     * @author MrShun
     * @version 1.0
     * @Date 2017-10-24
     */
    @Controller("api")
    public class TestController {

       /**
        * 返回一个test.jsp视图
        */
        @GET("/test")
        public String test() {
            return "test.jsp";
        }
    }
</pre>
<blockquote>
    <p>示例 Object 或 &lt;T&gt; 类型</p>
    <footer>返回无包装数据, <b>Json 类型</b> 返回包装数据带响应吗</footer>
</blockquote>
<pre class="code brush:java">
     /**
     * 测试控制器类
     * @author MrShun
     * @version 1.0
     * @Date 2017-10-24
     */
    @Controller("api")
    public class TestController {

        /**
         * 强制Object, 去掉值为null的属性
         * @return
         */
        @GET("/test")
        public Object test() {
            return "ok";
        }


        /**
         * 输出确定类型对象, 保留所有属性
         * @return
         */
        @GET("/test2")
        public Map test2() {
            Map result = new HashMap();
            result.put("data", "这是条数据");
            return result;
        }

        /**
         * 使用Json包装, 带响应码输出, 去掉值为null的属性
         * @return
         */
        @GET("/test3")
        public Object test3() {
            Map result = new HashMap();
            result.put("data", "这是条数据");
            return Json.success(result);
        }

        /**
         * 使用Json包装, 带响应码输出, 保留所有属性
         * @return
         */
        @GET("/test4")
        public Map test4() {
            Map result = new HashMap();
            result.put("data", "这是条数据");
            return Json.success(result);
        }
    }
</pre>
<blockquote>
    <p>示例 Resource 类型</p>
    <footer>返回资源里面的文件, 路径是resources下面的文件</footer>
</blockquote>
<pre class="code brush:java">
     /**
     * 测试控制器类
     * @author MrShun
     * @version 1.0
     * @Date 2017-10-24
     */
    @Controller("api")
    public class TestController {

        /**
         * 返回资源里面的文件，可以是网页
         * 也可以是图片, 样式， 脚本文件
         * @return
         */
        @GET("/test/txt")
        public Object test() {
            return new Resource("db.txt");
        }

        @GET("/test/img")
        public Object test() {
            return new Resource("test.png");
        }

        @GET("/test/html")
        public Object test() {
            return new Resource("test.html");
        }
    }

</pre>

<blockquote>
    <p>示例 参数绑定</p>
    <footer>支持简单数据校验, 以及支持application/json数据自动绑定</footer>
    <footer style="color:red;">@Param 表示当前参数为必传参数</footer>
</blockquote>
<pre class="code brush:java">
package cn.jants.demos;


import cn.jants.common.annotation.action.Controller;
import cn.jants.common.annotation.action.GET;
import cn.jants.common.annotation.action.Param;
import cn.jants.common.annotation.action.PathVariable;
import cn.jants.common.annotation.boot.PropertyConfiguration;
import cn.jants.common.annotation.service.Application;
import cn.jants.common.enums.Regex;
import cn.jants.core.context.AppConfiguration;
import cn.jants.core.startup.JTomcat;
import cn.jants.demos.entity.User;


/**
 * Tomcat 方式启动
 *
 * @author MrShun
 * @version 1.0
 * @Date 2017/12/20
 */
@Application
@PropertyConfiguration
@Controller
public class DemosApplication extends AppConfiguration {


    /**
     * 绑定name和age参数
     * 当出现@Param注解参数时为必传参数
     * 还可以对参数进行简单校验
     *
     * @param name
     * @param age
     */
    @GET("/binding/par")
    public void par(@Param String name, @Param(type = Regex.AGE, msg = "年龄输入有误!") Integer age) {
        //TODO 执行逻辑
    }

    /**
     * 让参数和实体类指定绑定
     * 不需要@Param注解
     *
     * @param user
     */
    @GET("/binding/entity")
    public void entity(User user) {
        //TODO 执行逻辑
    }

    /**
     * 参数和URL绑定
     *
     * @param path
     */
    @GET("/binding/{path}")
    public void entity(@PathVariable String path) {
        //TODO 执行逻辑
    }

    public static void main(String[] args) {
        JTomcat.run(DemosApplication.class, 80, "/demo");
    }
}
</pre>
<script type="text/javascript">
    $(function () {
        SyntaxHighlighter.highlight();
        $(".toolbar").remove();
    });
</script>